<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Vincular_Perfil_Menu extends CI_Controller {

	/* Layout utilizado pela pagina. */
	public $layout = 'default_admin';
	
	/* Titulo da Pagina. */
	public $title = CLIENTE;
	
	/* Menu do sistema*/
	public $menuTopo = '';
	
	/* Menu do sistema*/
	public $menuLateral = '';
	
	/* Caminho do pão do sistema */
	public $caminhoPao = '';
	
	/* css utilizado pela pagina. */
	public $css = array('admin/bootstrap', 'admin/animate', 'admin/style', 'plugins/waitMe/waitMe' );
	
	/* Js utilizado pela pagina. */
	public $js = array('plugins/jquery/jquery-2.1.4', 'admin/bootstrap', 'plugins/metisMenu/jquery.metisMenu', 'plugins/slimscroll/jquery.slimscroll.min', 'admin/principal', 'plugins/pace/pace.min', 'plugins/jquery-cookie/jquery.cookie', 'plugins/waitMe/waitMe');
	
	private $classe;
	
	public function __construct()
	{
		parent::__construct();
		//Verifica se o usuário está logado
		usuarioLogado($this->session->userdata('logged'));
		
		$this->load->model('Vpm_Funcionalidade_Model', 'vpm');
		$this->load->model('Vinculo_Perfil_Menu_Model', 'vinculo');
		$this->load->model('Perfil_Model', 'perfil');
		
		
		$this->classe = trim(strtolower(get_class($this)));	
		
		//Valida permissões do usuário
		$this->permissao_lib->validaUsuarioPermissaoAcessarModulo($this->classe);
		
		//Montando menu dinâmico
		$this->load->library('Menu_Lib', 'menu_lib');
		$this->menuTopo = $this->menu_lib->menuTopo();
		$this->menuLateral = $this->menu_lib->menuLateral($this->classe);
		$this->caminhoPao = $this->menu_lib->caminhoPao($this->classe, null, null);
		
	}
	
	public function index()	{					
		try {
				array_push($this->js, 'plugins/select2/select2.min', 'plugins/nestable/jquery.nestable', 'plugins/formValidation/formValidation', 'plugins/framework/bootstrap', 'admin/vincular_perfil_menu/vincular_perfil_menu');
				array_push($this->css, 'plugins/select2/select2', 'plugins/formValidation/formValidation');
				
				$tipoPerfil = decrypt(trim($this->session->userdata('tipoPerfil')));
				
				$perfis = $this->perfil->listarPerfisAtivos($tipoPerfil);
					
				$html = '<option></option>';
					
				foreach ($perfis as $row){
				
					$html .= '<option value="'.$row->idPerfil.'">'.$row->descricao.'</option>';
				}
				
				$data = null;
				$data["comboPerfil"] = $html;
				
				$this->load->view('admin/vincular_perfil_menu/vincular_perfil_menu', $data);
			
		}catch (Exception $e){
			echo ($e->getMessage());
		}
		
	}
	
	public function pesquisar()	{
		try {
			
			$this->layout = "";
			
			$retornoJson = false;
			$tipoMensagem = "";
			$mensagem = "";
			$html = "";
	
			$idPerfil = trim($this->input->post('perfil'));
			
			$perfil = $this->perfil->obter($idPerfil);
			
			$menuComVinculo = $this->vinculo->listarMenuPaiPorPerfil($idPerfil);
			$menuSemVinculo = $this->vinculo->listarMenuSemVinculoPorPerfil($idPerfil, $perfil->tipoPerfil);
			
			if (empty($menuComVinculo) && empty($menuSemVinculo)){
				
				//Não encontrou resultados
				$retornoJson = false;
				$tipoMensagem = "alert-info";
				$mensagem = "Sua pesquisa não retornou resultado!";
				
			}else{
				
				$html .= '<div class="row">
							<form id="formVinculo" class="form-horizontal" method="post" accept-charset="UTF-8">
								<input type="hidden" id="idPerfil" name="idPerfil" value="'.$perfil->idPerfil.'">
								<div class="col-md-8">
									<div class="ibox float-e-margins">
										<div class="ibox-title">
											<h5>Perfil:  '.$perfil->descricao.'</h5>
										</div>
										<div class="ibox-content">
											<div class="dd" id="nestable">';
				
				if (empty($menuComVinculo)){
					$html .= '<div class="dd-empty"></div>';
				}else{
					$html .= '<ol class="dd-list">';
						
					$html .= $this->montaMenuPai($idPerfil, $menuComVinculo);
						
					$html .= '</ol>';
				}
				
				$html .= '					</div>
											<textarea id="nestable-output" name="nestable-output" class="form-control text-area-nestable"></textarea>
											<div class="form-group text-center m-t-lg" >
												<div class="col-md-12">
													<button type="button" class="btn btn-default" id="buttonCancelar">
														<i class="fa fa-times"></i>&nbsp;&nbsp;Cancelar
													</button>
													<button type="submit" class="btn btn-primary" id="buttonSalvar">
														<i class="fa fa-save"></i>&nbsp;&nbsp;Salvar
													</button>
												</div>
											</div>
										 </div>
									 </div>
							   </div>';
					
				$html .= '	   <div class="col-md-4">
							 	 	<div class="ibox float-e-margins">
										<div class="ibox-title">
											<h5>Menus sem vínculos</h5>
										</div>
										<div class="ibox-content">
											<div class="dd" id="nestable2">';
				
				if (empty($menuSemVinculo)){
					$html .= '<div class="dd-empty"></div>';
				}else{
					$html .= '<ol class="dd-list">';
						
					$html .= $this->listarMenuSemVinculoPorPerfil($idPerfil, $menuSemVinculo);
						
					$html .= '</ol>';
				}
					
				$html .= '					</div>
											<textarea id="nestable-output2" name="nestable-output2" class="form-control text-area-nestable"></textarea>
										</div>
								 	</div>
								 </div>
							</form>
						</div>';
				
				$retornoJson = true;
				
			}
			
			$json = null;
			$json['sucesso'] = $retornoJson;
			$json['tipoMensagem'] = $tipoMensagem;
			$json['mensagem'] = $mensagem;
			$json['html'] = $html;
			
			echo json_encode($json);
				
		}catch (Exception $e){
			$json['sucesso'] = false;
			$json['tipoMensagem'] = "alert-danger";
			$json['mensagem'] = $e->getMessage();
			
			echo json_encode($json);
		}
	
	}
	
	public function salvar(){
		
		try {
				
			$this->layout = "";
			
			$this->util_lib->validaPermissaoRegistro("salvar", $this->classe);
			
			$retornoJson = false;
			$tipoMensagem = "";
			$mensagem = "";
			
			$idPerfil = trim($this->input->post('idPerfil'));
			$objVinculo = json_decode(trim($this->input->post('nestable-output')));
			$objSemVinculo = json_decode(trim($this->input->post('nestable-output2')));
			
			//Iniciando transação
			$this->db->trans_begin();
			
			if(!empty($objSemVinculo)){
				$retornoJson = $this->excluiVinculo($objSemVinculo, $idPerfil);
			}else{
				$retornoJson = true;
			}
			
			if ($retornoJson){
				$retornoJson = $this->salvaVinculo($objVinculo, $idPerfil);
			}
			
			if ($retornoJson){
				$this->db->trans_commit();
				$tipoMensagem = "alert-success";
				$mensagem = "Vinculo realizado com sucesso!";
			}
			
			$idPerfilLogin = decrypt(trim($this->session->userdata('idPerfil')));
			
			$json = null;
			
			if((int)$idPerfil === (int)$idPerfilLogin){
				$json['refresh'] = true;
			}else{
				$json['refresh'] = false;
			}
			
			$json['sucesso'] = $retornoJson;
			$json['tipoMensagem'] = $tipoMensagem;
			$json['mensagem'] = $mensagem;
				
			echo json_encode($json);
	
		}catch (Exception $e){
			$this->db->trans_rollback();
			
			$json['sucesso'] = false;
			$json['tipoMensagem'] = "alert-danger";
			$json['mensagem'] = $e->getMessage();
			
			echo json_encode($json);
		}
	
	}
	
	private function salvaVinculo($dados, $idPerfil){
		try{
			
			$contPai = 0;
			foreach ($dados as $row){
				
				if (isset($row->children)){
					
					$this->salvaVinculoPai($row, null, $contPai, $idPerfil);
					
					$contFilho = 0;
					
					foreach ($row->children as $row2){
						$this->salvaVinculoFilho($row2, $row->id, $contFilho, $idPerfil);
						$contFilho++;
					}
				}else{
					$this->salvaVinculoPai($row, null, $contPai, $idPerfil);
				}
				
				$contPai++;
			}
			
			return true;
				
		}catch (Exception $e){
			throw $e;
		}
	}
	
	private function salvaVinculoPai($dados, $idPai = null, $contPai, $idPerfil){
		try{
			
			$idMenu = $dados->id;
			
			$vinculoPerfilMenu = null;
			$vinculoPerfilMenu['idPerfil'] = $idPerfil;
			$vinculoPerfilMenu['idMenu'] = $idMenu;
			$vinculoPerfilMenu['idMenuPai'] = $idPai;
			$vinculoPerfilMenu['ordem'] = $contPai;
			
			return $this->salvaExcluirAlteraIncluiVinculo("S", $idMenu, $idPerfil, $vinculoPerfilMenu);
			
		}catch (Exception $e){
			throw $e;
		}
	}
	
	private function salvaVinculoFilho($dados, $idPai, $contFilho, $idPerfil){
		try{
			
			if (isset($dados->children)){
				$this->salvaVinculoPai($dados, $idPai, $contFilho, $idPerfil);
				
				$contFilho = 0;
				foreach ($dados->children as $row2){
					$this->salvaVinculoFilho($row2, $dados->id, $contFilho, $idPerfil);
					$contFilho++;
				}
			}else{
				$idMenu = $dados->id;
				
				$vinculoPerfilMenu = null;
				$vinculoPerfilMenu['idPerfil'] = $idPerfil;
				$vinculoPerfilMenu['idMenu'] = $idMenu;
				$vinculoPerfilMenu['idMenuPai'] = $idPai;
				$vinculoPerfilMenu['ordem'] = $contFilho;
				
				return $this->salvaExcluirAlteraIncluiVinculo("S", $idMenu, $idPerfil, $vinculoPerfilMenu);
			}
			
			return true;
				
		}catch (Exception $e){
			throw $e;
		}
	}
	
	private function excluiVinculo($dados, $idPerfil){
		try{
			
			foreach ($dados as $row){
				if (isset($row->children)){
					$this->excluiVinculoPai($row, $idPerfil);
						
					foreach ($row->children as $row2){
						$this->excluiVinculoFilho($row2, $idPerfil);
					}
				}else{
					$this->excluiVinculoPai($row, $idPerfil);
				}
			}
			
			return true;
		
		}catch (Exception $e){
			throw $e;
		}
	}
	
	private function excluiVinculoPai($dados, $idPerfil){
		try{
			
			$idMenu = $dados->id;
				
			return $this->salvaExcluirAlteraIncluiVinculo("E", $idMenu, $idPerfil);
				
		}catch (Exception $e){
			throw $e;
		}
	}
	
	private function excluiVinculoFilho($dados, $idPerfil){
		try{

			if (isset($dados->children)){
				$this->excluiVinculoPai($dados, $idPerfil);
	
				foreach ($dados->children as $row2){
					$this->excluiVinculoFilho($row2, $idPerfil);
				}
			}else{
				$idMenu = $dados->id;
	
				return $this->salvaExcluirAlteraIncluiVinculo("E", $idMenu, $idPerfil);
			}
			
			return true;
	
		}catch (Exception $e){
			throw $e;
		}
	}
	
	private function salvaExcluirAlteraIncluiVinculo($flag, $idMenu, $idPerfil, $vinculoPerfilMenu = null){
		try {
			
			//Verifica se existe o vinculo do perfil com o menu
			$retorno = $this->vinculo->obterVinculoPorPerfilIdMenu($idPerfil, $idMenu);
			
			//Exclusão
			if ($flag === 'E'){
				
				if (!empty($retorno)){
					if ($this->vpm->excluirPorIdVinculoPerfilMenu($retorno->idVinculoPerfilMenu)){
						return $this->vinculo->excluir($retorno->idVinculoPerfilMenu);
					}
				}
				
			}else{ //Alteração ou Inclusão
				
				if (empty($retorno)){
					
					$idVinculoPerfiMenu = $this->vinculo->inserir($vinculoPerfilMenu);
					
					if (!empty($idVinculoPerfiMenu) && $idVinculoPerfiMenu != false){
						return true;
					}
					
				}else{
					return $this->vinculo->alterar($vinculoPerfilMenu, $retorno->idVinculoPerfilMenu);
				}
				
			}
			
			return true;
			
		} catch (Exception $e) {
			throw $e;
		}
	}
	
	private function montaMenuPai($idPerfil, $lista){
	
		try {
	
			$html = "";
			
			foreach ($lista as $row){
				
				$html .= '<li class="dd-item" data-id="'.trim($row->idMenu).'">';
				
				//Busca Menu Filhos
				$menuFilho = $this->vinculo->listarMenuFilhoPorIdMenuPai($idPerfil, $row->idMenu);
				
				//Se não tiver menus filhos
				if (empty($menuFilho)){
					
					$html .= '  <div class="dd-handle">
									<span class="label label-info">
										<i class="'.trim($row->imgMenu).'"></i>
									</span> '.trim($row->descricao).'
								</div>';
						
				}else{
						
					$html .= '  <div class="dd-handle">
									<span class="label label-info">
										<i class="'.trim($row->imgMenu).'"></i>
									</span> '.trim($row->descricao).'
								</div>';
						
					$html .= $this->montaMenuFilho($idPerfil, $menuFilho);
					
				}
				
				$html .= '</li>';
			}
				
			return $html;
	
		} catch (Exception $e) {
			throw $e;
		}
	
	}
	
	private function montaMenuFilho($idPerfil, $lista){
	
		try {
				
			$html = ' <ol class="dd-list">';
				
			foreach ($lista as $row){
					
				$menuFilho = $this->vinculo->listarMenuFilhoPorIdMenuPai($idPerfil, $row->idMenu);
					
				$html .= '  <li class="dd-item" data-id="'.trim($row->idMenu).'">';
				
				//Se não tiver filho
				if (empty($menuFilho)){
					
					$html .= '  <div class="dd-handle">
									<span class="label label-info">
									<i class="'.trim($row->imgMenu).'"></i>
									</span> '.trim($row->descricao).'
								</div>';
						
				}else{
						
						
					$html .= '  <div class="dd-handle">
									<span class="label label-info">
									<i class="'.trim($row->imgMenu).'"></i>
									</span> '.trim($row->descricao).'
								</div>';
						
					$html .= $this->montaMenuFilho($idPerfil, $menuFilho);
	
				}
				
				$html .= ' </li>';
			}
	
			$html .= '</ol>';
				
			return $html;
	
		} catch (Exception $e) {
			throw $e;
		}
	
	}
	
	private function listarMenuSemVinculoPorPerfil($idPerfil, $lista){
		
		try {
			
			$html = "";
				
			foreach ($lista as $row){
			
				$html .= '<li class="dd-item" data-id="'.trim($row->idMenu).'">';
						
				$html .= '	<div class="dd-handle">
								<span class="label label-info">
									<i class="'.trim($row->imgMenu).'"></i>
								</span> '.trim($row->descricao).'
							</div>';
			
				$html .= '</li>';
			}
			
			return $html;
			
			
		} catch (Exception $e) {
			throw $e;
		}
	}
	
}